package model;

import java.util.Calendar;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;

import org.hibernate.annotations.ForeignKey;

@Entity
public class Movimentacao {

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;
	
	@Temporal(TemporalType.DATE)
	private Calendar data;
	
	@Column(length = 20)
	private String tipo;
	
	@OneToMany(mappedBy = "movimentacao", orphanRemoval = true, fetch = FetchType.LAZY, cascade = CascadeType.ALL)
	private List<ItemMovimento> itens;
	
	@ManyToOne(fetch = FetchType.EAGER)
	@ForeignKey(name="fk_cliente")
	private PessoaFisica cliente;
	
	@ManyToOne(fetch = FetchType.EAGER)
	@ForeignKey(name="fk_mecanico")
	private PessoaFisica mecanico;
	
	@ManyToOne(fetch = FetchType.EAGER)
	@ForeignKey(name="fk_fornecedor")
	private PessoaJuridica fornecedor;
	
	@ManyToOne(fetch = FetchType.EAGER)
	@ForeignKey(name="fk_usuario")
	private Usuario usuario;
	
	@ManyToOne(fetch = FetchType.EAGER)
	@ForeignKey(name="fk_veiculo")
	private Veiculo veiculo;

	@Column(length=2000)
	private String observacao;
	
	@Transient
	private Double valorTotal;
	
	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public Calendar getData() {
		return data;
	}

	public void setData(Calendar data) {
		this.data = data;
	}

	public String getTipo() {
		return tipo;
	}

	public void setTipo(String tipo) {
		this.tipo = tipo;
	}

	public List<ItemMovimento> getItens() {
		return itens;
	}

	public void setItens(List<ItemMovimento> itens) {
		this.itens = itens;
	}

	public PessoaFisica getCliente() {
		return cliente;
	}

	public void setCliente(PessoaFisica cliente) {
		this.cliente = cliente;
	}

	public PessoaFisica getMecanico() {
		return mecanico;
	}

	public void setMecanico(PessoaFisica mecanico) {
		this.mecanico = mecanico;
	}

	public PessoaJuridica getFornecedor() {
		return fornecedor;
	}

	public void setFornecedor(PessoaJuridica fornecedor) {
		this.fornecedor = fornecedor;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public Veiculo getVeiculo() {
		return veiculo;
	}

	public void setVeiculo(Veiculo veiculo) {
		this.veiculo = veiculo;
	}

	public String getObservacao() {
		return observacao;
	}

	public void setObservacao(String observacao) {
		this.observacao = observacao;
	}

	public Double getValorTotal() {
		
		Double vlrSubTotal = 0D;
		Double vlrServico = 0D;
		Servico s = null;
		
		valorTotal = 0D;
		
		if ( (this.getItens() != null) && (!this.getItens().isEmpty())) {

			for (ItemMovimento im : this.getItens()){
				vlrSubTotal = im.getSubTotal() == null ? 0D : im.getSubTotal();

				if (s != im.getServico()) {
					vlrServico = im.getValorServico() == null ? 0D : im.getValorServico();
					s = im.getServico();
				}

				valorTotal += vlrSubTotal + vlrServico;
			}

		}
		
		return valorTotal;
	}

	@Override
	public String toString() {
		final int maxLen = 10;
		return "Movimentacao [id=" + id	+ 
				", \ndata=" + data + 
				", \ntipo=" + tipo + 
				", \nitens=" + (itens != null ? itens.subList(0, Math.min(itens.size(), maxLen)) : null) + 
				", \ncliente=" + cliente + 
				", \nmecanico=" + mecanico + 
				", \nfornecedor=" + fornecedor + 
				", \nusuario=" + usuario + 
				", \nveiculo=" + veiculo + 
				", \nobservacao=" + observacao + "]";
	}
}
